package com.hit.eduService.listener;

//读excel文件需要的监听器

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hit.eduService.entity.EduSubject;
import com.hit.eduService.entity.excel.SubjectData;
import com.hit.eduService.service.EduSubjectService;
import com.hit.serviceBase.exceptionHandler.MyException;

import javax.jws.Oneway;

//本类的对象在EduSubjectServiceImpl中需要被手动new出来，所以不能使用spring ioc容器管理
// (所以不能用spring容器中的EduSubjectService对象，所以需要通过构造方法传入)，不能注入其他对象，不能实现数据库操作
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {

    public EduSubjectService eduSubjectService;
    public SubjectExcelListener(){}
    public SubjectExcelListener(EduSubjectService eduSubjectService){
        this.eduSubjectService=eduSubjectService;
    }


    //读取方法,调用invoke方法每次读取excel的一行，把excel的信息保存到数据库的表中
    @Override
    public void invoke(SubjectData data, AnalysisContext analysisContext) {
        if(data==null){
            throw new MyException(20001,"文件数据为空");
        }
        //首先判断这一行的第一个字段（一级分类）是否已经保存在表中了，如果没保存需要把这个字段加入表中作为科目
        EduSubject  subject1=getSubject1(eduSubjectService,data.getOneSubjectName());
        if(subject1==null){//一级分类名为data.getOneSubjectName()在数据表中不存在，需要添加到表中
            subject1=new EduSubject();
            subject1.setParentId("0");
            subject1.setTitle(data.getOneSubjectName());
            eduSubjectService.save(subject1);//把这一项添加到表中
        }

        //然后获取一级分类的id值，用来判断 一级分类对应的二级分类是否已经保存在表中，如果不存在需要创建这一项
        //此时一级分类的id就是subject1对象的id
        String oneId=subject1.getId();
        EduSubject subject2=getSubject2(eduSubjectService, data.getTwoSubjectName(),oneId);
        if(subject2==null){//二级分类在表中不存在，则需要添加到表中
            subject2=new EduSubject();
            subject2.setTitle(data.getTwoSubjectName());
            subject2.setParentId(oneId);
            eduSubjectService.save(subject2);//二级分类保存到表中
        }
    }

    //到数据库的edu_subject表中找是否存在名称为oneSubjectName的一级分类,如果找到返回对应的EduSubject对象，如果没找到返回null
    public  EduSubject getSubject1(EduSubjectService eduSubjectService,String oneSubjectName){
        QueryWrapper<EduSubject> wrapper=new QueryWrapper<>();
        //查找数据表中是否有title为 oneSubjectName的一级分类，需要表的parent_id字段为"0"
        wrapper.eq("title",oneSubjectName);
        wrapper.eq("parent_id","0");
        //到数据表中查找这一项，保存到对应的entity类中
        EduSubject oneSubject=eduSubjectService.getOne(wrapper);
        return oneSubject;
    }

    //到edu_subject表中查找是否有title为twoSubjectName的二级分类,并且它对应的一级分类的id是oneId,如果找到返回对应的EduSubject类对象，如果没找到返回null
    public EduSubject getSubject2(EduSubjectService eduSubjectService,String twoSubjectName,String oneId){
        QueryWrapper<EduSubject> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("title",twoSubjectName);
        queryWrapper.eq("parent_id", oneId);
        EduSubject eduSubject=eduSubjectService.getOne(queryWrapper);
        return eduSubject;
    }
    //完成之后执行的方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}
